# -*- coding:utf-8 -*-

# @Time    : 2023/11/20 13:54
# @Author  : wanggang
# @Email   : wanggang2@lingxi.ai
# @Software: LLM_internal

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
import sys
import asyncio
sys.path.append('../../../')
from bot.financial_sales.agent.base_agent import LLMAgent
from typing import List


default_template_v1 = """
请记住，你是一名专业的{role_name}，你正通过电话和用户沟通，你需要根据对话记录、解决方案，销售技巧和用户情境，在解决方案和销售技巧备选话术中选择或组合最合适的话术回复用户。你主要的任务是回应并解决用户的问题，然后引导用户完成操作并全额借款，实现金条的销售转化。为了完成这个任务，你需要不断讲解活动、优惠券等给用户带来的权益，通过多轮对话激发用户用款需求，引导用户完成借款。

注意以下事项：
1.你的场景是电话销售，表达的内容足够通俗易懂简洁且口语化，随和、高中文化可理解，尽量表现出足够的亲和力和专业性。
2.如果用户当前有问题或疑问，在考虑解决用户问题的同时，也需要注意销售技巧的引导，特别是对话的初始阶段，一定要注意销售技巧的完整。当用户表示在忙、不需要等情况时，不要着急挂机，在不引起用户反感的情况下，继续进行多次劝服用户完成操作借款。
3.根据对话记录和当前的对话阶段做出回应,不要重复用户说过的信息,回复的内容不要有英文，不要有重复的卖点话术，要基有一定的变化，回复话术不要太长。只产生你的话术，不要产生用户的对话，每次只生成一个回复！把开头的"很抱歉"等句式过滤掉，非挂机结束语中不要表达诈骗相关的提醒。
4.当用户连续3次表达在忙、不需要、会考虑等、或者用户有投诉倾向时，先安抚客户再礼貌再见挂机。
5.生成的话术只能在解决方案话术集中选择一句话术或者在销售技巧话术集中选择一句话术，需要保障原有话术的完整性，不要无中生有，也不要过度生成。
6.回复的话术可以是候选集的一句话术，也可以将解决方案话术集中选择一条话术和销售技巧的一条话术进行拼接，但最终回复的话术只能有一个问题，不能同时出现两个问题，这样会使用户困扰。
7.对话的初始阶段(前6轮)，对于有疑问非投诉的用户，在回答用户问题的同时，也一定要使用销售技巧话术的拼接。
8.在"询问有无App"时，先确认用户是否有京东App，没有京东APP再确认是否有京东金融App。
9.需要加用户微信时，先询问是否可以添加微信，用户同意则发送申请并结束再见，用户不同意则不发送申请并结束再见。

{user_question_solution}

{sales_skill_name}

用户情境：{user_situation}

{knowledge_solution_set}

{sales_skill_utter_set}

{conversation_history}

基于{role_name}需要沟通的话术内容，选择其的下一步话术是：
"""

class ConversationGenerate(LLMAgent):
    """话术生成-agent"""
    def __init__(self, role_name, conversation_history, user_question, solution, knowledge_solution_set, sales_skill_name, sales_skill_utter_set, user_situation):
        conversation_history = "会话历史：\n" + conversation_history
        if solution:
            self.user_question_solution = "解决方案：" + solution
        elif user_question:
            self.user_question_solution = "用户问题：" + user_question
        else:
            self.user_question_solution = ""

        if sales_skill_name:
            self.sales_skill_name = "销售技巧：" + sales_skill_name
        else:
            self.sales_skill_name = ""

        if sales_skill_utter_set:
            self.sales_skill_utter_set = "销售技巧话术集：\n" + str(sales_skill_utter_set)
        else:
            self.sales_skill_utter_set = ""

        if knowledge_solution_set:
            self.knowledge_solution_set = "解决方案话术集：\n" + str(knowledge_solution_set)
        else:
            self.knowledge_solution_set = ""

        self.prompt = default_template_v1.format(role_name=role_name,
                                              conversation_history=conversation_history,
                                              user_situation=user_situation,
                                              user_question_solution=self.user_question_solution,
                                              knowledge_solution_set=self.knowledge_solution_set,
                                              sales_skill_name=self.sales_skill_name,
                                              sales_skill_utter_set=self.sales_skill_utter_set)
        super().__init__(self.prompt)


class Conversation_test(LLMAgent):

    def __init__(self):

        self.prompt = '''
请记住，你是一名专业的销售员，你正通过电话和用户沟通，你需要根据对话记录、解决方案，销售技巧和用户情境，在解决方案和销售技巧备选话术中选择或组合最合适的话术回复用户。你主要的任务是回应并解决用户的问题，然后引导用户完成操作并全额借款，实现金条的销售转化。为了完成这个任务，你需要不断讲解活动、优惠券等给用户带来的权益，通过多轮对话激发用户用款需求，引导用户完成借款。

注意以下事项：
1.你的场景是电话销售，表达的内容足够通俗易懂简洁且口语化，随和、高中文化可理解，尽量表现出足够的亲和力和专业性。
2.如果用户当前有问题或疑问，在考虑解决用户问题的同时，也需要注意销售技巧的引导，特别是对话的初始阶段，一定要注意销售技巧的完整。当用户表示在忙、不需要等情况时，不要着急挂机，在不引起用户反感的情况下，继续进行多次劝服用户完成操作借款。
3.根据对话记录和当前的对话阶段做出回应,不要重复用户说过的信息,回复的内容不要有英文，不要有重复的卖点话术，要基有一定的变化，回复话术不要太长。只产生你的话术，不要产生用户的对话，每次只生成一个回复！把开头的"很抱歉"等句式过滤掉，非挂机结束语中不要表达诈骗相关的提醒。
4.当用户连续3次表达在忙、不需要、会考虑等、或者用户有投诉倾向时，先安抚客户再礼貌再见挂机。
5.生成的话术只能在解决方案话术集中选择一句话术或者在销售技巧话术集中选择一句话术，需要保障原有话术的完整性，不要无中生有，也不要过度生成。
6.回复的话术可以是候选集的一句话术，也可以将解决方案话术集中选择一条话术和销售技巧的一条话术进行拼接，但最终回复的话术只能有一个问题，不能同时出现两个问题，这样会使用户困扰。
7.对话的初始阶段(前6轮)，对于有疑问非投诉的用户，在回答用户问题的同时，也一定要使用销售技巧话术的拼接。
8.在"询问有无App"时，先确认用户是否有京东App，没有京东APP再确认是否有京东金融App。
9.需要加用户微信时，先询问是否可以添加微信，用户同意则发送申请并结束再见，用户不同意则不发送申请并结束再见。

用户问题： 不需要

销售技巧： 加微申请提醒

用户情境：{'用户年龄': '26', '初始用户权益': '无权益', '是否已打开APP': '已打开APP', '有无APP': '有京东APP'}

解决方案话术集：
[{'用户情境': '已打开APP', '话术': '您别误会哈，大部分老客户这次借款都不是缺资金，是想利用活动使用金条，增加调额调息的几率，以系统审核为准，这样您有资金需求的时候能及时帮到您，您可以先看下好吧？', '用户问题': '不需要', '录音编号': 'SD214-11C'}, {'用户情境': '已打开APP', '话术': '好的，那您如果会操作的话，稍后挂机可以自己尝试一下，咱们借款的金额越大，期数越长，更有利于账户的活跃，如果没有借款需求的也没关系哈您根据自己的需求选择就行，我这么说您好理解吧？', '用户问题': '不需要', '录音编号': 'SD682-11C'}, {'用户情境': '已打开APP', '话术': '这次只针对部分优质的老用户，邀请参与金条才有机会获得额度和费率的调整，每个客户只能享受一次，这个活动平时也很少，有过期失效就不能用了，就是想让您利用它使用下，增加额度和费用调整的几率，具体以系统显示为准，您别错过好吧？', '用户问题': '不需要', '录音编号': 'SD210-11C'}, {'用户情境': '已打开APP', '话术': '不质疑您资金能力，这次其实就是让您查看活动，参与金条提现使用；可给您创造一个有助于额度和费率调整的机会，具体以系统显示为准，为了您后期真实有需要更好用好吧？', '用户问题': '不需要-不缺钱', '录音编号': 'SD211-11C'}, {'用户情境': '无权益', '话术': '哦哦，明白，是这样的也是为了和您建立长期合作关系嘛，您可以多次活跃下账户，有利于提高您的额度降低利息，后续像买车啊装修啊有需要用大钱的时候也方便拿到更合适的额度和费率嘛，具体以审批为准，您先看一下好吗？', '用户问题': '不需要/不需要-不缺钱/不需要-会考虑/不需要-使用其他平台', '录音编号': 'SD717-11C'}, {'话术': '您这次可以使用下全部额度的，额度使用成功之后，您在【京东金条借款】微信公众号上回复‘我要提额’，审核结果会有短信提示您，到时候您可以关注一下，这次您可以先使用一次好吧？', '用户问题': '不需要/不需要-不缺钱/不需要-会考虑/不需要-使用其他平台', '录音编号': 'SD735-11C'}, {'用户情境': '已打开APP', '话术': '没关系哈，这次也是把优惠通知到您，额度全部用完后，您可以去微信搜索关注公众号“京东金条借款”，留言我要提额，系统会二次评估，额度调整成功会有短信通知，以系统审核为准，建议您趁着活动也能参与下好吧？', '用户问题': '用户多次不需要', '录音编号': 'SD241-11C'}, {'话术': '借款没有硬性要求，选择权在您手上的，主要这次的活动您可以再多了解一下', '用户问题': '激活是否必须使用', '录音编号': 'B79'}]

销售技巧话术集：
[{'沟通策略': '加微申请提醒', '话术': '好的，感谢您的配合了，那您方便的时候在微信聊天界面上找一下橘黄色小喇叭，上面写着服务通知，您在里边通过下好友申请就行，就不多打扰您了，温馨提示，京东金融注重保护客户隐私，如接收到“京东金融”名义的电话或不明链接：报出您电话号码、索要个人信息、让您转账汇款或下载其他app等均为诈骗，请勿相信并拨打。同时，您可通过京东金融app主页搜索“电话号码核实”，输入联系号码，进行身份核实，祝您生活愉快，再见', '录音编号': 'SD502-11C', '动作标签': '挂机'}, {'沟通策略': '加微申请提醒-在忙', '话术': '您待会空闲看看微信里有没有服务通知的企业微信邀请哈，有的话您添加我一下，那就先不打扰您了，您先忙，温馨提示，近期网络电信诈骗频发，请您谨防诈骗。祝您生活愉快，再见。', '录音编号': 'SD501-11C', '动作标签': '挂机'}, {'沟通策略': '加微申请提醒-在忙', '话术': '您方便的时候在微信聊天界面上找一下服务通知，是橘色小喇叭的头像，您在里边通过下企业微信的好友申请就行，就不多打扰您了，温馨提示，近期网络电信诈骗频发，请您谨防诈骗。祝您生活愉快，再见。', '录音编号': 'SD504-11C', '动作标签': '挂机'}, {'沟通策略': '通过公众号引导用户提额', '用户情境': '无权益', '话术': '另外和您说一下，这次额度使用之后呢，您在【京东金条借款】微信公众号上回复‘我要提额’’，那系统评估到您有大额需求的话，还是有可能会再次调整的，一旦审核通过系统会短信通知您的，您先自己尝试操作一下好吧？', '录音编号': 'SD724-11C'}, {'沟通策略': '带操作-嘱咐用户活动详情', '话术': '好的，那您如果会操作的话，稍后挂机可以自己尝试一下，如果有问题后续我们这边再给您回访，另外也是温馨提示您，咱们借款的金额越大，期数越长，更有利于账户的活跃，您到时候可以关注一下好吧？', '录音编号': 'SD680-11C'}, {'沟通策略': '表明来意', '用户情境': '无权益', '话术': '哎，您好，我这边是您的京东金融客户经理，工号95266，就金条为了回馈老用户，去给您争取到一个额度和利率调整的机会，这个具体的话呢，以系统审核为准，最近您有登录到app去查看使用了吗？', '录音编号': 'SD700-11C', '动作标签': '发券:'}, {'沟通策略': '引导打开App', '用户情境': '有京东APP', '话术': '您看一下，我这边一直在线哈，您打开京东app了跟我说，就是就咱们平时买东西的那个京东app，嗯...您打开了吗？', '录音编号': 'SD90-11C'}]

会话历史：
销售员:喂您好，请问您是郑女士吗？
用户:喂。啊，你说的。
销售员:您好，我是京东金融的客户经理哈，工号95266，来电是为了通知到您，咱们金条借款服务为了回馈老客户，特意给你账户发了一张利息打折券，这次打折活动也是只特邀了极少部分的优质用户参与的，想问一下您这边最近有没有查看过您的利息打折券呢？
用户:嗯，没注意。
销售员:是这样的，这次优惠活动只有极少用户才能享有，也是希望您能再次参与金条服务，不仅能省不少利息，还能增加账户活跃度，有利于额度费率的再次调整，具体以系统审核为准，活动有效期只有几天，也是担心您错过优惠嘛，您先打开app看下好吧？
用户:嗯，我再看一下，嗯。
销售员:那我长话短说哈，金条产品近期有活动，您可以把您的金条额度取出来用一笔，这样可以刷新您的使用记录，后续平台有优惠活动也会第一时间通知到您的，具体以app显示为准，快速带您看一下好吧？
用户:好。
销售员:好的，那我和您简单说说，您手机上有京东app吗？
用户:app有啊。
销售员:好的，那就很方便了，操作非常简单，您先打开免提，返回手机主页面，然后找到京东APP打开，（停顿2秒）嗯..您打开了吗
用户:哦，我看到了。
销售员:打开京东app之后，您先点击右下角【我的】，然后在挨着我的钱包那一横排有个【金条借款】，您看到【金条借款】这几个字了吗？
用户:我借款看到了
销售员:看到金条借款，您直接点击进去，然后页面上就会出现您当前可借额度，底下有个【我要借款】的大按钮，您看到了吗？
用户:哦，我看到了。
销售员:然后点击一下【我要借款】，就会出现借款页面了，您看到了吗？
用户:看到了
销售员:那我和您说一下这个页面怎么看哈，【借多久】这里，最短1个月最长12个月，您可以自由选择，【怎么还】这里，您根据需求选择您的还款方式就行，一般老客户都选择按月还，分12个月，这样月均还款额最少，您看我这么说您好理解吧？
用户:嗯嗯，理解。
销售员:那这边您先按照需求选择一下，金额建议用全额，分期12期，因为您有优惠券嘛，这样利息优惠的最多而且还款压力最小，然后您按照需求选择好后点击【确认借款】，后面您按提示操作就行，很简单，您一会自己操作一下好吧？
用户:好，我一会操作一下。
销售员:要不您看这样吧，我用官方企业微信添加一下您，后续针对金融方面的问题可以直接问我，有什么优惠也会优先推送给您，我给您发送好友申请，您通过下可以吗?
用户:好。


基于销售员需要沟通的话术内容，选择其的下一步话术是：
'''
        super().__init__(self.prompt)


async def extract_user_info(session_id, conversation_history):
    conversation = Conversation_test()
    user_question = await conversation.achat_auto_llm(type='gpt')
    print(f"session_id:{session_id},整理后的用户问题是:{user_question}")


if __name__ == '__main__':

    asyncio.run(extract_user_info('123', ''))